Dando continuidade a nossa srie, vamos falar hoje sobre execusso
condicional e blocos de repetio.

Achou complicado?

Continue lendo e voc vai ver que  super simples, quando a gente
entende o que  e como usar.

Essa , na minha opinio, a parte fundamental para quem deseja aprender
a programar.

Siga lendo...

****

Execusso condicional e blocos de repetio.

[0]ndice
1. Introduo a execuo condicional.
2. Condicional simples
3. Condicional composta

4. Introduo aos blocos de repetio.
5. Blocos de repetio
5.1 Whille
5.2 Repeate/until
5.3 For

[1] Introduo a execuo condicional

    Chamamos de execusso condicional o ato de executar uma rotina
mediante a uma ou mais condies serem falsas ou verdadeiras.
    Vamos imaginar a seguinte situao:
Em um determinado programa, ao pressionarmos a tecla esc,  perguntado
se desejamos realmente sair da aplicao.
Devemos responder sim, apertando a tecla s, ou no, apertando a tecla n.

Caso o usurio responda 's', o programa permanece aberto, mas se
responder 'n', o programa se fecha.
    O caso acima ilustra a verificao de uma condisso para a execusso
de uma rotina.
    Nesse exemplo, a condisso  a resposta do usurio.
    O programa vai verificar qual foi a resposta dada.
Se foi 's', o programa deve continuar, se for n, deve enserrar.

Agora que temos uma idia de como funciona a execusso condicional,
vamos ver suas formas de uso nos prximos tens desse texto.

[2] Condicional simples
Verifica se uma ou mais condies so verdadeiras.
Forma de uso:
if condicao then,
onde: condicao  a condio que se deseja verificar.
A palavra then significa ento em ingls, e deve ser colocada sempre no fim
da condio a ser verificada.
Exemplo:
if j > 10 then
sintwriteln ('O nmero que voc digitou  maior que 10');

O exemplo acima verifica se um valor guardado na varivel j  maior que 10.
Se for, ele escreve a mensagem:
O nmero digitado  maior que 10.

Vejamos outras possibilidades de execusso condicional:

If i > 10 then
//Verifica se i  maior que 10

If i < 10 then
//Verifica se i  menor que 10.

If i = 10 then
//Verifica se i  igual a 10

if i <> 10 then
//Verifica se i  diferente de 10

if i >= 10 then
Verifica se i  maior ou igual a 10.
if i <= 10 then
//Verifica se i  menor ou igual a 10.

Alm dos operadores de comparao que vimos agora
(maior, menor, igual, maior igual, menor igual e diferente),
temos tambm os operadores lgicos, que podem ser usados para ampliar ainda
mais a lista de condies a serem verificadas.
So eles:
And - operador lgico e.
Exemplo:
if (i > 10) and (p > 30) then
Verifica se i  maior que 10 e p  maior que 30.
Para a condio ser satisfeita, os dois casos devem ser verdade: i ser maior que 10 e p ser maior que 30.

Or - operador lgico ou.
Exemplo:
if (i > 10) or (p > 30) then
Verifica se i  maior que 10 ou p  maior que 30.
Para que a condio seja satisfeita, um dos dois casos devem ser verdade:
ou i deve ser maior que 10, ou p deve ser maior que 30.
Tambm  considerado verdadeiro se as duas condies forem verdade: i maior que 10 e p maior que 30.

Xor - operador ou exclusivo.
Xor significa exclusive or.
A diferena do xor para o or,  que, diferente do or, que retorna verdadeiro
no caso de todas as condies serem verdade, o xor s retorna verdadeiro se uma das
condies serem verdadeiras.
Por exemplo:
if (i > 10) xor (p > 30) then
Se i for maior que 10, mas p no for maior que 30, ento  verdadeiro.
Se p for maior que 30, mas i no for maior que 10, tambm  verdadeiro.
Se i no for maior que 10, nem p for maior que 30, ento  falso.
E se i for maior que 10 e p for maior que 30... falso!
Diferente do or, que retornaria verdadeiro.

H tambm o operador not.
Not significa no em ingls.
Ele  chamado de operador de negao e serve para inverter os valores booleanos,
isso ,
falso passa a ser verdadeiro e verdadeiro passa a ser falso.
Confuso?
Vamos ver um exemplo simples:

program testando;
uses dvcrt, dvwin;
var i : integer;

begin
i := 50;
sintinic (0, '');

if not i > 30 then
sintetiza ('oioioi');
readln;
sintfim;
end.

O exemplo acima tem uma varivel do tipo inteiro i.
 dada a essa varivel o valor 50.
I := 50;

Depois, verificamos se i no  maior que 30.
Se no for, sintetiza a mensagem oioioi.
No caso, no vai ser sintetizado por que i  maior que 30.

Experimente esse exemplo com outros valores.
Retire o not, use os operadores lgicos, troque os operadores de comparao...

Outra forma de usar o if:
if condicao then
begin
instrucao1;
instrucao 2;
instrucao 3...
end;

Essa forma  usada quando h mais de uma tarefa a executar no caso da condio
ser satisfeita.
Por  exemplo:

if i > 10 then
begin
sintetiza('i  maior que 10');
sintetiza('At a prxima');
end;

No exemplo acima, caso i seja maior que 10, tudo que est entre o begin e o end
ser executado.

tambm se pode usar if dentro de if, assim:

if i > 10 then
begin
Sintwriteln ('Digite seu nome');
sintreadln (nome);
if nome = 'Pedro' then
sintwriteln ('Seu nome  pedro, nome de um amigo meu!');
end;

Note que no begin da primeira condio (i > 10)
tem outro if (if nome = 'Pedro');

O segundo if s vai ser executado se o primeiro for satisfeito.

Isso  o que chamamos de blocos aninhados e que no conseguamos fazer antes
no scripvox 5.

[3] Condicional composta:
A condicional composta permite fazermos tudo que vimos at aqui.
A diferena  que alm de verificar se uma condio ou as condies so verdadeiras
ou falsas, a condicional composta permite definirmos o que fazer no caso delas no serem verdadeiras
e de verificarmos outras possibilidades.
Vamos exemplificar:

if i > 10 then
sintwriteln ('O nmero  maior que 10')
else
if i > 5 then
sintwriteln ('O nmero  maior que 5')
else
sintwriteln ('O nmero  5 ou est abaixo de 5');

Vamos entender o que aconteceu:
Primeiro verificamos se i  maior que 10.
No caso de ser verdade, escreveria a mensagem  o nmero  maior que 10.
Se no for, verifica a instruo abaixo do else ( Else significa seno em ingls).
No caso, se i  maior que 5.
Se for, escreve a mensagem o nmero  maior que 5.
E se no for,
escreve que o nmero  5 ou est abaixo de 5.

Agora, duas curiosidades devem ter ficado:
1. Esqueceu dos ponto e vrgula?
No. A linha antes do else no leva ponto e vrgula.
2. Como voc afirmou que o nmero pode ser 5 ou menor que 5, se voc no fez
essa verificao?
Pela negativa das anteriores.
Se a verificao de i ser maior que 10 deu falso e a de i ser maior que 5 tambm
deu falso, o que sobra  apenas a possibilidade de i ser 5.
*
Blocos de Repetio
[4]Introduo aos blocos de repetio;
Assim como a execusso condicional, que no scripvox  feita com
se/seno, e nas outras linguagens, como, no pascal por exemplo como if/else, os blocos de repetio
existem em qualquer linguagen e tm um papel fundamental na
construo de uma rotina.

    Sem eles, certos trabalhos se tornariam um tdio para o programador.
Quer ver um exemplo?
Como voc faria um programa para escrever 100 vezes a frase "Hoje 
domingo.", somente com o que voc viu at agora?

Certamente algo parecido com isso:

SintWriteln ('Hoje  domingo.');
SintWriteln ('Hoje  domingo.');
SintWriteln ('Hoje  domingo.');
SintWriteln ('Hoje  domingo.');
SintWriteln ('Hoje  domingo.');
SintWriteln ('Hoje  domingo.');
..
at completar 100 linhas.
Ou ento:

var x : string = 'Hoje  domingo';
begin
SintWriteln(x);
SintWriteln(x);
SintWriteln(x);
SintWriteln(x);
SintWriteln(x);
...
sintfim;
end.
at completar 100 linhas.

Mas, se eu te disser que voc pode repetir, 100 vezes, ou at mais, a
frase hoje  domingo, escrevendo muito menos linhas de cdigo, qual
opo voc escolheria?
Acredito que a de escrever menos, no ?
    Pois  exatamente isso que veremos nessa aula: como economizar
linhas de cdigo.

Escrevendo menos, voc torna seu programa mais legvel, mais fcil de entender
e aproveita mais da linguagem escolhida para escrever seu projeto, no nosso caso,
pascal para dosvox.

[5]    Blocos de repetio;

[5.1] While
    Usado sempre quando no sabemos quantas vezes um trecho do programa
deve ser repetido.
While significa enquanto em ingls.
    Forma de uso:
Simples:
while condicao do
executa;
Ou ento
while condicao do
begin
executa;
executa;
executa;
executa;
..
end;

Voc tambm pode usar os operadores lgicos, como vimos no caso do if/else.
Por exemplo:
while (i<5) and (opcao=#$1b) do
begin
..
end;

Isso quer dizer: enquanto i for menor que 5  e opcao for a tecla esc.
inicia um bloco, faz o que est dentro dele e sai.
O programa vai verificar as condies:
i menor que 5 e opcao = esc.
Se for verdade, entra no bloco e faz o que est l.
Chegando no end, volta no incio, verifica novamente, e, sempre que for verdade,
vai fazer a mesma coisa:
entrar no bloco, realizar as tarefas at o end, voltar e verificar.

Assim que a condio estabelecida der falso, o bloco para de ser executado.

Uma coisa muito comum de acontecer  no haver no bloco uma forma de fazer com que a condio
mude, gerando asssim uma repetio sem fim.

No exemplo acima, eu preciso, dentro do meu bloco, fazer com que
a tecla possa ser diferente de esc e que o nmero seja maior que 5.
Caso contrrio, meu programa ir travar nesse trecho, pois nunca minha condio
ser diferente.

[5.2]Repeat/until;
    Usado sempre que se deseja executar o bloco ao menos uma vez.
Sintaxi:
repeat
instrucao1;
instrucao2;
..
until condicao;

A diferena do repeat para o while,  que no while, o bloco pode nunca ser executado,
e no repeat, ele ser executado obrigatoriamente uma vez.
Em resumo:
no while, a condio  testada no incio do bloco,
no repeat,  testada no final.

Exemplo:

repeat
sintwriteln('Qual sua opo?');
opcao := readkey;
until opcao = #27;

O exemplo acima repete a seguinte situao:
Pergunta ao usurio qual opo.
l do teclado um caracter, com a funo readkey, o que em scripvox
 o mesmo que o comando l com o modificador e comercial ao fim da linha.
Faz isso at que o usurio aperte esc.

[5.3] For
Usado sempre que desejamos repetir um trecho um nmero determinado de vezes.

Para usar esse comando, precisamos declarar uma varivel do tipo inteiro, que
servir como controladora.
Sintaxe:
for valorinteiro := valorinicial to valor final do
condicao;
ou ainda:

for valorinteiro := valorinicial to valor final do
begin
instrucao1;
instrucao2;
instrucao3;
..
end;

Vamos ver o exemplo abaixo:

program hojeedomingo;
uses
dvcrt, dvwin;

var contadora : integer;

begin
sintinic (0, '');

For contadora := 1 to 100 do
sintwriteln ('Hoje  domingo');
sintfim;
end.

Temos acima um programa que vai escrever na tela 100 vezes a frase 'hoje  domingo'.

Primeiro, declaramos uma varivel do tipo inteiro, que chamamos de contadora;
Depois, no corpo do programa, usamos o for:
for contadora := 1 to 100 do
Podemos traduzir como:
Para contadora de 1 at 100 faa
A linha abaixo ento ser repetida at que a varivel contadora tenha o valor 100.
O valor inicial ser 1.
A cada vez que a instruo  executada, a varivel recebe mais 1.
Ao chegar em 100, a instruo no  mais executada.
